import 'reflect-metadata'

// 访问器装饰器是用来装饰访问器的 get set 方法

// 属性装饰器 用来装饰类的属性 (target: object, propertyKey: string | symbol) => void
// 元数据添加 实现参数校验

/**
 * @description:
 * @param {any} target 装饰的目标对象，对于静态属性来说就是类的构造器，对于实例属性来说就是类的原型对象
 * @param {string} propertyKey 装饰器的属性名称
 * @return {*}
 */
function required(target: any, propertyKey: string) {
  // 说明在 User 的原型上面添加了 username 属性
  console.log(target === User.prototype) // true
  // 添加元数据 就是给类的原型对象的 username 属性上添加一个 required 的元数据
  Reflect.defineMetadata('required', true, target, propertyKey);
}

class User {
  @required
  username: string;
}

const user = new User();
user.username = '1q23';

function validate(user: User) {
  for (let key in user) {
    if(Reflect.getMetadata('required', user, key)) {
      if(!user[key]) {
        throw new Error(`属性${key}不能为空`)
      }
    }
  }
}

validate(user)
